import { Logger } from '../utils/logger.js';
import { stringVisualWidth, splitStringByVisualWidth } from '../utils/string-util.js';
import { fileURLToPath } from 'url';
import config from '../utils/config.js';
import clipboardy from 'clipboardy';

const logger = new Logger();

// 显示帮助信息
function showHelp(filter = null) {
  const scripts = config.yamlConfig;

  logger.info('='.repeat(90));
  logger.info(' '.repeat(30) + '📚 NPM Scripts 帮助文档');
  logger.info('='.repeat(90));
  logger.info('');

  // 按分类分组
  const categories = {};
  Object.entries(scripts).forEach(([name, info]) => {
    // 处理 YAML 中的冒号（build:core → build:core）
    const scriptName = name.replace(/:/g, ':');

    // 如果有过滤条件，检查是否匹配
    if (filter) {
      const lowerFilter = filter.toLowerCase();
      const matchName = scriptName.toLowerCase().includes(lowerFilter);
      const matchDesc = info.description.toLowerCase().includes(lowerFilter);
      const matchCategory = (info.category || '').toLowerCase().includes(lowerFilter);
      if (!matchName && !matchDesc && !matchCategory) {
        return;
      }
    }

    const category = info.category || '其他';
    if (!categories[category]) {
      categories[category] = [];
    }
    categories[category].push({ name: scriptName, ...info });
  });

  // 如果没有匹配结果
  if (Object.keys(categories).length === 0) {
    logger.warning(`没有找到匹配 "${filter}" 的命令`);
    return;
  }

  // 输出每个分类
  Object.entries(categories).forEach(([category, items], index) => {
    if (index > 0) logger.info(''); // 分类之间的空行

    // 分类标题
    logger.info(`┌─ ${category} ${'─'.repeat(85 - stringVisualWidth(category))}┐`);
    logger.info('│' + ' '.repeat(88) + '│');

    items.forEach((item, itemIndex) => {
      // 命令和描述
      const cmdStr = `pnpm ${item.name}`;
      logger.info(
        `│  ${cmdStr.padEnd(20)} ${item.description}${' '.repeat(65 - stringVisualWidth(item.description))}│`
      );

      // 别名
      if (item.alias && item.alias.length > 0) {
        const aliasStr = `别名: ${item.alias.join(', ')}`;
        logger.info(
          `│  ${''.padEnd(20)} ${aliasStr}${' '.repeat(65 - stringVisualWidth(aliasStr))}│`
        );
      }

      // 示例
      if (item.examples && item.examples.length > 0) {
        item.examples.forEach((example, index) => {
          // 处理带注释的示例
          const comment = config.getComment(['scripts', item.name, 'examples', index]).comment;
          if (comment) {
            let exampleStr = `示例: ${example}  #${comment}`;
            splitStringByVisualWidth(exampleStr, 63).forEach((str) => {
              logger.info(`│${''.padEnd(22)} ${str}${' '.repeat(65 - stringVisualWidth(str))}│`);
            });
          } else {
            logger.info(`│  ${''.padEnd(20)} 示例: ${example.padEnd(59)}│`);
          }
        });
      }

      // 提示信息
      if (item.tips) {
        splitStringByVisualWidth(item.tips, 63).forEach((tip, index) => {
          if (index === 0) {
            logger.info(`│${''.padEnd(20)}💡 ${tip}${' '.repeat(65 - stringVisualWidth(tip))}│`);
          } else {
            logger.info(`│${''.padEnd(22)} ${tip}${' '.repeat(65 - stringVisualWidth(tip))}│`);
          }
        });
      }

      // 项目之间的分隔线（除了最后一项）
      if (itemIndex < items.length - 1) {
        logger.info('│  ' + '·'.repeat(84) + '  │');
      }
    });

    logger.info('│' + ' '.repeat(88) + '│');
    logger.info('└' + '─'.repeat(88) + '┘');
  });

  // 底部信息
  logger.info('');
  logger.info('💡 使用提示:');
  logger.info('  • 运行命令:            pnpm <script-name>');
  logger.info('  • 查看特定类别:        pnpm conf:help <keyword>');
  logger.info('  • 更新文档:            pnpm conf:docs');
  logger.info('  • 验证脚本配置:        pnpm conf:valid');
  logger.info('  • 同步到 package.json: pnpm conf:sync');
}

// 主程序
const __filename = fileURLToPath(import.meta.url);
const isMain = process.argv[1] === __filename;

if (isMain) {
  const args = process.argv.slice(2);
  const filter = args[0] || null;

  if (filter === '--json') {
    // 输出 JSON 格式（用于其他工具）
    const scripts = config.yamlConfig;
    const text = JSON.stringify(scripts, null, 2);
    logger.info('输出 JSON 格式（用于其他工具）:\n' + text);
    try {
      await clipboardy.write(text);
      logger.success('已复制到剪贴板');
    } catch (error) {
      logger.error('复制失败');
    }
  } else {
    showHelp(filter);
  }
}

export { showHelp };
